"""
页面基础操作
"""
import os

import allure
import pywinauto
from tools.tool_logger import *
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


from config import BASE_PATH


class Base:
    def __init__(self, driver):
        """
        初始化浏览器
        :param driver: 通过testcase实例化
        """
        self.driver = driver

    def base_find_element(self, loc, time_out=20, poll=0.5):
        """
        定位页面元素方法
        :param loc: 定位元素信息, 例：（By.ID, 'id'）
        :param time_out: 定位最大时间，默认值20秒
        :param poll: 定位间隔时间，0.5秒
        :return: 元素对象
        """
        logger.info('base定位元素开始')
        try:
            return (WebDriverWait(self.driver,
                                  time_out,
                                  poll).until(EC.presence_of_element_located(loc)))
        except Exception as e:
            logger.error(f'base定位元素失败，报错信息为：{e}')

    def base_click(self, loc, **kwargs):
        """
        页面元素点击方法
        :param loc: 定位元素信息, 例：（By.ID, 'id'）
        :param kwargs: 不定长参数，可设置定位元素最大时间和间隔时间
        """
        logger.info('base点击操作开始')
        try:
            self.base_find_element(loc, **kwargs).click()
        except Exception as e:
            logger.error(f'base点击操作失败，报错信息为：{e}')

    def base_send_keys(self, loc, value, **kwargs):
        """
        输入方法
        :param loc: 定位元素信息, 例：（By.ID, 'id'）
        :param value: 输入内容
        :param kwargs: 不定长参数，可设置定位元素最大时间和间隔时间
        """
        logger.info('base输入操作开始')
        try:
            self.base_find_element(loc, **kwargs).clear()
            self.base_find_element(loc, **kwargs).send_keys(value)
        except Exception as e:
            logger.error(f'base输入操作失败，报错信息为{e}')

    def base_get_text(self, loc, **kwargs):
        """
        获取元素文本信息方法
        :param loc: 定位元素信息, 例：（By.ID, 'id'）
        :param kwargs: 不定长参数，可设置定位元素最大时间和间隔时间
        :return: 元素文本信息
        """
        logger.info('base获取元素文本信息开始')
        try:
            return self.base_find_element(loc, **kwargs).text
        except Exception as e:
            logger.error(f'base获取元素文本信息失败，报错信息为{e}')

    def base_switch_to_handle(self, n):
        logger.info('base切换句柄开始')
        try:
            handles = self.driver.window_handles
            self.driver.switch_to_window(handles[n])
        except Exception as e:
            logger.error(f'base切换句柄失败，报错信息为：{e}')

    def base_push_file(self, alert_name, edit, file_path, btn):
        logger.info('base上传文件开始')
        try:
            self.app = pywinauto.Desktop()
            win = self.app[alert_name]
            win[edit].type_keys(file_path)
            win[btn].click()
        except Exception as e:
            logger.error(f'base上传文件失败，报错信息为：{e}')

    def base_page_back(self):
        logger.info('base页面返回开始')
        try:
            self.driver.back()
        except Exception as e:
            logger.error(f'base页面返回失败，报错信息为：{e}')

    def base_page_forward(self):
        logger.info('base页面前进开始')
        try:
            self.driver.forward()
        except Exception as e:
            logger.errorr(f'base页面前进失败，报错信息为：{e}')

    def base_go_to_page(self, url):
        logger.info('base跳转页面开始')
        try:
            self.driver.get(url)
        except Exception as e:
            logger.error(f'base跳转页面失败，报错信息为：{e}')

    def base_get_screenshot_as_file(self, file_name):
        logger.info('base获取屏幕截图开始')
        try:
            self.file_path = BASE_PATH + os.sep + "image" + os.sep + file_name
            self.driver.get_screenshot_as_file(self.file_path)
            self.__base_write_img()
        except Exception as e:
            logger.error(f'base获取屏幕截图失败，报错信息为：{e}')

    def __base_write_img(self):
        with open(self.file_path,'rb') as f:
            allure.attach(f.read(), "错误原因:", allure.attachment_type.PNG)

    def base_switch_to_frame(self, loc):
        self.driver.switch_to_frame(loc)


